<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>严格模式中的变化</title>
    <!-- 
        严格模式对 Javascript 的语法和行为，都做了一些改变。

        1. 变量规定

        ① 在正常模式中，如果一个变量没有声明就赋值，默认是全局变量。严格模式禁止这种用法，变量都必须先用 var 命令声明，然后再使用。

        ② 严禁删除已经声明变量。例如，delete x; 语法是错误的。 

        2. 严格模式下 this 指向问题

        ① 以前在全局作用域函数中的 this 指向 window 对象。

        ② 严格模式下全局作用域中函数中的 this 是 undefined。

        ③ 以前构造函数时不加 new也可以 调用,当普通函数，this 指向全局对象

        ④ 严格模式下,如果 构造函数不加new调用, this 指向的是undefined 如果给他赋值则 会报错

        ⑤ new 实例化的构造函数指向创建的对象实例。

        ⑥ 定时器 this 还是指向 window 。

        ⑦ 事件、对象还是指向调用者。

        3. 函数变化

        ① 函数不能有重名的参数。

        ② 函数必须声明在顶层。新版本的 JavaScript 会引入“块级作用域”（ ES6 中已引入）。为了与新版本接轨，不允许在非函数的代码块内声明函数。

     -->
</head>
<body>
    
</body>
<script>
    'use strict';
     // 1. 我们的变量名必须先声明再使用
    // num = 10  报错
    // console.log(num);
    var num = 10
    console.log(num);
    // 2.我们不能随意删除已经声明好的变量
    // delete num;
    // 3. 严格模式下全局作用域中函数中的 this 是 undefined。
    // function fn(){
    //     console.log(this);
    // }
    // fn()
    // 4. 严格模式下,如果 构造函数不加new调用, this 指向的是undefined 如果给他赋值则 会报错.
    function Star(){
        this.sex = '男'
    }
    // Star()
    var ldh = new Star()
    console.log(ldh.sex);
// 5. 定时器 this 还是指向 window 
    setTimeout(function(){
        console.log(this);
    },1000)
// 6. 严格模式下函数里面的参数不允许有重名
    // function fn(a,a) {
    //     console.log(a + a);
    // }
    // fn(1,2)
    function fn(){
        
    }
</script>
</html>